package cc.lishixi.tdd.inject.custom;

import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Parameter;

/**
 * 注解对应的处理类，
 * 在测试类中，通过@ExtendWith注解使用
 *
 * @author LiShixi 2021/1/1 4:49 下午
 * @email loyy77@163.com
 */
public class RandomParametersExtension implements ParameterResolver {
    @Override
    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        return parameterContext.isAnnotated(Random.class);
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {

        final Parameter parameter = parameterContext.getParameter();
        java.util.Random random1 = extensionContext.getRoot().getStore(ExtensionContext.Namespace.GLOBAL)//
                .getOrComputeIfAbsent(java.util.Random.class);
        final Class<?> type = parameter.getType();
        //final java.util.Random random1 = new java.util.Random(1);
        if (double.class.equals(type)) {
            return random1.nextDouble();
        } else if (int.class.equals(type)) {
            return random1.nextInt();
        } else {
            throw new ParameterResolutionException(String.format("没有实现的类型【%s】", type));
        }
    }

    /**
     * 这里实现个注解
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.PARAMETER)
    public @interface Random {

    }
}
